package com.atguigu.gmall.product.service.impl;

import com.atguigu.gmall.product.entity.BaseAttrValue;
import com.atguigu.gmall.product.mapper.BaseAttrValueMapper;
import com.atguigu.gmall.product.service.BaseAttrValueService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.gmall.product.entity.BaseAttrInfo;
import com.atguigu.gmall.product.service.BaseAttrInfoService;
import com.atguigu.gmall.product.mapper.BaseAttrInfoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
* @author lfy
* @description 针对表【base_attr_info(属性表)】的数据库操作Service实现
* @createDate 2023-07-11 15:27:09
*/
@Service
public class BaseAttrInfoServiceImpl extends ServiceImpl<BaseAttrInfoMapper, BaseAttrInfo>
    implements BaseAttrInfoService{

    @Autowired
    BaseAttrInfoMapper baseAttrInfoMapper;

    @Autowired
    BaseAttrValueService baseAttrValueService;
    @Override
    public List<BaseAttrInfo> getAttrInfoAndValueList(Long c1Id, Long c2Id, Long c3Id) {


        List<BaseAttrInfo> infos =  baseAttrInfoMapper.getAttrInfoAndValueList(c1Id,c2Id,c3Id);

        return infos;
    }

    @Override
    public void saveAttrInfo(BaseAttrInfo info) {
        //1、保存 attr_info。 会自动生成id
        baseAttrInfoMapper.insert(info);


        //2、保存属性值
        List<BaseAttrValue> valueList = info.getAttrValueList();
        for (BaseAttrValue attrValue : valueList) {
            //回填平台属性名的自增Id
            attrValue.setAttrId(info.getId());
        }

        baseAttrValueService.saveBatch(valueList);
    }

    @Transactional
    @Override
    public void updateAttrInfo(BaseAttrInfo info) {
        //1、修改 属性名 信息
        this.updateById(info);
//        boolean update = this.lambdaUpdate()
//                .eq(BaseAttrInfo::getId, info.getId())
//                .update(info);

        //2、修改 属性值 信息
        List<BaseAttrValue> attrValueList = info.getAttrValueList();

        //统计前端提交了哪些带id的属性值
        List<Long> ids = new ArrayList<>();

        for (BaseAttrValue attrValue : attrValueList) {
            if (attrValue.getId() != null) {
                ids.add(attrValue.getId());
            }
        }

        //59、60 保存原属性值id
        //从数据库删除前端没有提交的值，就是要删除的属性值
        //DELETE FROM base_attr_value     WHERE (id NOT IN () AND attr_id = ?)
        if(!ids.isEmpty()){
            boolean remove = baseAttrValueService.lambdaUpdate()
                    .notIn(BaseAttrValue::getId, ids)
                    .eq(BaseAttrValue::getAttrId,info.getId())
                    .remove();
        }

        //for循环请用 stream api 替代

        //有修改、有新增、有删除。 引用关系比较复杂的表，不能删了重建。
        for (BaseAttrValue value : attrValueList) {
            //前端提交了属性值id，说明这个属性是修改
            if (value.getId()!=null) {
                baseAttrValueService.updateById(value);
            }

            //前端没提交属性值id，说明这个属性是新增
            if (value.getId() == null) {
                //回填属性id
                value.setAttrId(info.getId());
                baseAttrValueService.save(value);
            }
        }

        // 原来： 59、60、61
        // 现在： 59、60、new、new

        //前端： 59、60   数据库：59、60、61
        //delete from xx where id not in(59、60)



    }
}




